﻿using System.Collections.Generic;
using System.Linq;
using Inovout.Data.Repository;
using Inovout.Data.Domain;

namespace Inovout.Data.Service
{
    public interface IRepositoryService { }
    /// <summary>
    /// RepositoryService的接口定义
    /// </summary>
    /// <typeparam name="TEntity">实体类型</typeparam>
    public interface IRepositoryService<TEntity> : IRepositoryService
    {
        /// <summary>
        /// 新建模型对象，但没有保存至数据库。通常用于Controller中的New的Action。
        /// </summary>
        /// <returns></returns>
        TEntity New();
        /// <summary>
        /// 保存模型对象
        /// </summary>
        /// <param name="entity"></param>
        void Save(TEntity entity);
        /// <summary>
        /// 批量插入，Id生成必须为非数据库生成，如：Guid
        /// </summary>
        /// <param name="entities">模型对象集合</param>
        void BulkInsert(IEnumerable<TEntity> entities);
        /// <summary>
        /// 批量更新，Id生成必须为非数据库生成，如：Guid，且不能为乐观锁，如：Version
        /// </summary>
        /// <param name="entities">模型对象集合</param>
        void BulkUpdate(IEnumerable<TEntity> entities);

        /// <summary>
        /// 删除模型
        /// </summary>
        /// <param name="entity">模型对象实例</param>
        void Delete(TEntity entity);
        /// <summary>
        /// 批量删除
        /// </summary>
        /// <param name="entities">模型对象集合</param>
        void BulkDelete(IEnumerable<TEntity> entities);

        /// <summary>
        /// 通过主键查找模型
        /// </summary>
        /// <typeparam name="TEntity">模型类型</typeparam>
        /// <param name="id">主键</param>
        /// <returns>实体对象实例</returns>
        TEntity FindById(object id);

        /// <summary>
        /// 重新回棋模型，在多线程开发时使用，用于切换不同线程的Session对象实例
        /// </summary>
        /// <param name="entity">模型对象实例</param>
        void Load(TEntity entity);

        /// <summary>
        /// 查询所有的模型集合
        /// </summary>
        /// <returns>模型对象集合</returns>
        IEnumerable<TEntity> FindAll();

        /// <summary>
        /// 基于NHibernate的IQueryable对象实例。有状态的Session。
        /// </summary>
        /// <typeparam name="TEntity">实体类型</typeparam>
        /// <returns>有状态的IQueryable对象实例</returns>
        IQueryable<TEntity> Query();
        /// <summary>
        /// 基于NHibernate的IQueryable对象实例。有状态的Session。
        /// </summary>
        /// <typeparam name="TEntity">实体类型</typeparam>

        /// <returns>无状态IQueryable对象实例</returns>
        IQueryable<TEntity> StatelessQuery();
    }
}
